package com.lovi.notepaper.database;

import android.content.Context;

import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;

import com.lovi.notepaper.dao.NoteDao;
import com.lovi.notepaper.entities.Note;

/**
 * Room 数据库类，用于定义数据库的实体类和版本号
 * entities：定义数据库中的实体类
 * version：定义数据库的版本号
 * exportSchema：是否导出数据库的版本迁移信息
 */
@Database(entities = Note.class, version = 2, exportSchema = false)
public abstract class NoteDatabase extends RoomDatabase {
    private static NoteDatabase noteDatabase;

    /**
     * 获取 NoteDatabase 实例的静态方法
     * synchronized：保证线程安全
     * @param context 上下文对象
     * @return 返回 NoteDatabase 实例
     */
    /*
    单例模式：
    每次调用 getNoteDatabase() 方法时，都会先检查 NoteDatabase 实例是否已经存在，
    如果不存在则创建一个新的实例，并返回该实例。这样就实现了 NoteDatabase 的单例模式

    作用：
    1.提高性能，减少重复执行的操作
    2.确保数据一致性
    3.简化代码逻辑，只需要初始化一次。

     */
    public static NoteDatabase getNoteDatabase(Context context) {
        if (noteDatabase == null) {
            //synchronized 关键字添加到方法上，保证在多线程环境下，只会有一个线程进入下一步进行数据库实例的创建，从而避免出现多个数据库实例的情况
            synchronized (NoteDatabase.class) {
                if (noteDatabase == null) {
                    //如果还是不存在
                    //调用 Room 的 databaseBuilder() 方法创建 NoteDatabase 实例，并指定数据库名为 "note"。
                    //调用 build() 方法构建 NoteDatabase 实例，并将其赋值给 noteDatabase。
                    noteDatabase = Room.databaseBuilder(context, NoteDatabase.class, "note")
                            .addMigrations(MIGRATION_1_2)
                            .build();
                    //原来的
                    //noteDatabase = Room.databaseBuilder(context, NoteDatabase.class, "note").build();
                }
            }
        }
        return noteDatabase;
    }

    /**
     * 声明一个抽象方法，用于获取 NoteDao 实例
     * @return 返回 NoteDao 实例
     */
    //作用是返回一个 NoteDao 实例，用于对数据库进行增删改查操作。
    public abstract NoteDao noteDao();

    static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE note ADD COLUMN inColor TEXT");
            database.execSQL("ALTER TABLE note ADD COLUMN outColor TEXT");
        }
    };
}

